文件类型

文件类型有普通文件、目录问及那、设备文件、socket文件、符号链接 文件、命名管道文件等

文件类型是创建文件的时候建立的.并且一经创建, 类型无法修改.

许可位与特殊属性位

每个文件都有9位的许可权限和 3 位的特殊属性, 他们是在文件创建的时候 建立的, 创建后, 它们可以被 chmod 系统调用修改

   fd = creat("newfile", 0744);

creat 的第二个参数指定了要创建文件的许可位, 这个参数只是请求, 而 不是命令.内核会通过 "新建文件掩码" 来得到文件的最终模式.

新建文件掩码

新建文件掩码 是一个很有用的系统变量, 它指定哪些位需要被关掉. 例如防止程序创建能被同组用户和其他用户修改的文件, 可以通过 关掉 ---w--w- 来实现. 这可以通过吧 "新建文件掩码" 的值设置为 八进制数 022 来实现.

   umask(022);

这里 umask 是一个系统命令, 可以改变变量 umask 的值

改变文件的模式

程序可以通过系统调用 chmod 来改变文件模式

   chmod("/tmp/myfile", 04764);
   chmod("/tmp/myfile", S_ISUID|S_IRWXU|S_IRGRP|S_IWGRP|S_IROTH);
后者有明显的有点, 当系统定义的许可值位的值改变时, 无需修改程序.

系统调用 chmod 不受 "新建文件掩码" 的影响

  chmod
目标 修改文件的许可权限和特殊属性
头文件 #include <sys/types.h> / #include <sys/stat.h>
原型 int result = chmod(char *path, mode_t mode);
参数 path 路径/mode 新的许可权限和特殊属性
返回值 -1 error, 0 success

文件的链接数

链接数就是文件被应用的次数

文件的所有者与组

每个文件都有文件的所有者, Unix 通过用户 ID 和组 ID 来标识文件 所有者和文件所属组

文件所有者

文件所有者就是创建文件的用户, 用户通过 creat 建立文件时, 内核把 所有者设为运行程序的用户, 如果程序具有 set-user-ID 位, 那么新文 件的文件所有者就是程序的文件所有者.

通常情况下, 新文件的组被设为执行创建动作的用户所在组. 有些情况下, 组会被设为与父目录的组相同.

修改文件所有者和组

通过系统调用 chown 来修改文件所有者和组

   chown("file1", 200, 40);
  chown
目标 修改文件所有者和组
头文件 #include <unistd.h>
原型 int chown(char *path, uid_t owner, gid_t group);
参数 path 文件名/owner 新的所有者ID/group 新的组ID
返回值 -1 error, 0 success

文件大小

文件、目录和命令管道的大小是他们实际所占用的存储空间和字节数目.

时间

每个文件都有 3 个时间: 最后修改(modification)时间、最后访问(access) 时间和属性(如用户所有者ID、许可权限)修改时间.

当文件被操作时, 内核会自动的修改这些时间, 也可以编程来修改最后 修改时间和最后访问时间

  utime
目标 修改文件最后修改时间和最后访问时间
头文件 #include<sys/time.h>/#include <utime.h>/#include<sys/types.h>
原型 int utime(char *path, struct utimbuf *newtimes)
参数 path 文件名/ newtimes 指向结构变量 utimbuf 的指针
返回值 -1 错误, 0 成功

文件名

系统调用 creat 创建文件时会指定一个文件名.

系统调用 rename 可以修改文件/目录的名字, 还可以移动文件的位置.

  rename
目录 修改文件名活移动文件的位置
头文件 #include <stdio.h>
函数原型 int result = rename(char *old, char *new)
参数 old 原来的文件名活目录名/new 新的文件名或目录名
返回值 -1 错误 / 0 成功